package com.hl.sfzy.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.hl.sfzy.constant.SystemCode;
import com.hl.sfzy.exception.ProjectException;
import com.hl.sfzy.pojo.User;
import lombok.Data;

import java.util.Date;
import java.util.Map;

public class JWTUtils {
    // 随机秘钥，加密数据的
    private static final String SECRET = "!@@$@#@#@SGerwe";
    // token签发者
    private static final String ISSUSRE = "zzjm";
    // token过期时间
    private static final long EXPRE_TIME = 60 * 10000L;

    /*
     * 生成Token1
     * */
    public static String Token(User userInfo){
        Date now = new Date();
        // 配置秘钥,创建算法对象
        Algorithm algorithm = Algorithm.HMAC256(SECRET);
        // 创建jwt构建器对象
        JWTCreator.Builder builder =  JWT.create();
        // 添加签发者（token）
        builder.withIssuer(ISSUSRE);
        // 设置签发时间
        builder.withIssuedAt(now);
        // 设置过期时间
        builder.withExpiresAt(new Date(now.getTime()+ EXPRE_TIME));
        // 设置token中携带的参数
        builder.withClaim("userId", userInfo.getId());
        builder.withClaim("username", userInfo.getUsername());
        String token = builder.sign(algorithm);
        return  token;
    }
    /*
     * 生成Token2
     * */
    public static String createToken(Map<String, String> map){
        Date now = new Date();
        // 创建jwt构建器对象
        JWTCreator.Builder builder = JWT.create();
        // 设置过期时间
        builder.withExpiresAt(new Date(now.getTime() + EXPRE_TIME));
        map.forEach((k, v)->{
            builder.withClaim(k, v);
        });
        return  builder.withIssuer(ISSUSRE).sign(Algorithm.HMAC256(SECRET));
    }
    // 校验token
    public static Map<String, Claim> verifyToken(String token){
        // 算法对象
        Algorithm algorithm = Algorithm.HMAC256(SECRET);
        // 生成检验器对象
        JWTVerifier jwtVerifier = JWT.require(algorithm).build();
        try{
            // 解码对象
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            // 获取签名参数
            return decodedJWT.getClaims();
        }catch (Exception e){
            // 打印异常
            e.printStackTrace();
            throw new ProjectException(SystemCode.VERIFY_TOKEN_FAIL.getMessage(), SystemCode.VERIFY_TOKEN_FAIL.getCode());
        }
    }
    // 获取签名参数
    public static DecodedJWT verify(String token){
        return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
    }
}
